import numpy as np
from matplotlib import pyplot as plt
"""
数据集即三维点 (x,y) 和对应的高度值，共有256个点。
高度值使用一个 height function f(x,y) 生成。
 x, y 分别是在区间 [-3,3] 中均匀分布的256个值，
 并用meshgrid在二维平面中将每一个x和每一个y分别对应起来，编织成栅格:
"""
# 1、准备数据
def create_data(x,y):
    return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2)
n = 256
x = np.linspace(-3,3,n)
y = np.linspace(-3,3,n)
X,Y = np.meshgrid(x,y)
# 2、绘制等值线图
"""
8代表等高线的密集程度，这里被分为10个部分。如果是0，则图像被一分为二。
透明度为0.75，并将 f(X,Y) 的值对应到color map的RdBu组中寻找对应颜色。
"""
# plt.xticks(())
# plt.yticks(())
ax = plt.gca()
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

for label in ax.get_xticklabels()+ax.get_yticklabels():
    label.set_fontsize(10)
    label.set_bbox(dict(facecolor='white',edgecolor='none',alpha=0.75))
plt.contourf(X,Y,create_data(X,Y),10,alpha=0.75)
# 2、等高线绘制:使用plt.contour函数划线。位置参数为：X, Y, f(X,Y)。颜色选黑色，线条宽度选0.5
c = plt.contour(X,Y,create_data(X,Y),8,colors='black',linewidth=0.5)
# 3.添加高度数字：通过 plt.clabel() 在等高线上加入高度数值，即加入Label，
# 其中参数 inline 控制是否将 Label 画在线里面，fontsize 设置字体大小为10。并将坐标轴隐藏：
plt.clabel(c,inline=True,fontsize=12)
plt.show()